<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      var person = {
        getName: function () {
          // 这个this怎么指向person1
          return this.name;
        },
      };
      var person1 = {
        name: '科比',
      };

      // 一定是对call 用的非常熟悉
      // 参数接收的  改变this指向的参数
      Function.prototype.myCall = function (context) {
        // 这里面的this是谁?
        // 这里的this必须是一个function  this指的getName()函数
        if (typeof this !== 'function') {
          throw new Error('error');
        }
        context = context || window;
        // 考虑参数
        // 拿到除了第一个参数以外的参数
        var args = [...arguments].slice(1);
        // console.log(args)
        // 解构传值
        // console.log(this);
        // 要在person1 上面来假设有一个方法 相当于在person1里面加一个 getName()方法，就可以调用了
        context.fn = this;
        const result = context.fn(...args);
        // 再删除person1上的这个属性
        delete context.fn;
        return result;
      };

      console.log(person.getName.myCall(person1, 1, 2, 3));
    </script>
  </body>
</html>
